home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
language
/
iconv8_s.arc
/
ICONT.ARC
/
LGLOB.C
< prev
next >
Wrap
C/C++ Source or Header
|
1990-03-28
|
4KB
|
113 lines
/*
* lgloc.c -- routines for processing .u2 files.
*/
#include "..\h\config.h"
#include "general.h"
#include "tproto.h"
#include "link.h"
#include "opcode.h"
#include "..\h\version.h"
int nrecords = 0; /* number of records in program */
/*
* readglob reads the global information from infile (.u2) and merges it with
* the global table and record table.
*/
novalue readglob()
{
register char *id;
register int n, op;
int k;
int implicit;
char *name;
struct gentry *gp;
extern char *progname;
if (getopc(&name) != Op_Version)
quitf("ucode file %s has no version identification",inname);
id = getid(); /* get version number of ucode */
newline();
if (strcmp(id,UVersion)) {
fprintf(stderr,"version mismatch in ucode file %s\n",inname);
fprintf(stderr,"\tucode version: %s\n",id);
fprintf(stderr,"\texpected version: %s\n",UVersion);
exit(ErrorExit);
}
while ((op = getopc(&name)) != EOF) {
switch (op) {
case Op_Record: /* a record declaration */
id = getid(); /* record name */
n = getdec(); /* number of fields */
newline();
gp = glocate(id);
/*
* It's ok if the name isn't already in use or if the
* name is just used in a "global" declaration. Otherwise,
* it is an inconsistent redeclaration.
*/
if (gp == NULL || (gp->g_flag & ~F_Global) == 0) {
putglobal(id, F_Record, n, ++nrecords);
while (n--) { /* loop reading field numbers and names */
k = getdec();
putfield(getid(), nrecords, k);
newline();
}
}
else {
lfatal(id, "inconsistent redeclaration");
while (n--)
newline();
}
break;
case Op_Impl: /* undeclared identifiers should be noted */
if (getopc(&name) == Op_Local)
implicit = 0;
else
implicit = F_ImpError;
break;
case Op_Trace: /* turn on tracing */
trace = -1;
break;
case Op_Global: /* global variable declarations */
n = getdec(); /* number of global declarations */
newline();
while (n--) { /* process each declaration */
getdec(); /* throw away sequence number */
k = getoct(); /* get flags */
if (k & (F_Proc & ~F_Global))
k |= implicit;
id = getid(); /* get variable name */
gp = glocate(id);
/*
* Check for conflicting declarations and install the
* variable.
*/
if (gp != NULL &&
(k & (F_Proc & ~F_Global)) && gp->g_flag != F_Global)
lfatal(id, "inconsistent redeclaration");
else if (gp == NULL || (k & (F_Proc & ~F_Global)))
putglobal(id, k, getdec(), 0);
newline();
}
break;
case Op_Link: /* link the named file */
name = getrest(); /* get the name and */
/* name = getstr(); /* get the name and */
alsolink(name); /* put it on the list of files to link */
newline();
break;
default:
quitf("ill-formed global file %s",inname);
}
}
}